CaseWhenExpression для PostgreSQL #229
Open
+130
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
На прошлой неделе делал генерацию отчетов и внезапно понадобилось использовать Conditional Expression выражение из PostgreSQL. Соотвественно написал вот такой вот CaseWhenExpression.
Есть нужно использовать только одно условия и else, то их можно передать в метод create через аргументы - первый аргумент это условие when, второй аргумент - значение/выражение возвращаемое в случае если условие выполняется и третий аргумент это else.
Если необходимо задать дополнительные условия то есть метод addCase с двумя аргемунтами: условие - первый аргумент и то что необходимо вернуть в случае успешного выполнения условия.
В SQL все условия генерируются в порядке их добавления, else всегда ставится последним. При генерации в SQL в случае если в addCase передавались строки, то первая строка по умолчанию считается полем, а вторая считается значением. Соотвественно в случае PostgreSQL они оборачиваются в разные кавычки и по разному эскейпятся.
Возможно в методу toDialectString необходимо добавить Assert на пустое количество условий т.к. в этом случае сгенерируется не валидный SQL. (Напишите что думаете по этому поводу)
Bonus:
Небольшой фикс в PrefixUnaryExpression::create - перевернул параметры при передаче их в конструктор, т.к. сейчас в create один порядок аргументов, а в конструкторе другой. Моя ошибка был не прав. Это кривой фикс для сохранения BC. С другой стороны PrefixUnaryExpression редко кто использует, думаю, и, пожалуй, можно и изменить порядок аргументов в самом методе create. (Напишите что думаете и по этому поводу)
P.S. судя по логу неправильный create по какой-то причине когда-то сделал я